//
//  HMTabBar.swift
//  Weibo24
//
//  Created by apple on 17/3/26.
//  Copyright © 2017年 itheima. All rights reserved.
//

import UIKit
//  定义代理协议, 继承这个NSObjectProtocol协议可以使用weak关键字,对代理对象若引用
protocol HMTabBarDelegate: NSObjectProtocol {
    //  点击撰写按钮的操作
    func didSelectedComposeButtonOperation()
}

//  自定义UITabBar
class HMTabBar: UITabBar {
    
    //  MARK: ---懒加载控件
    lazy var composeButton: UIButton = {
        let button = UIButton()
        //  添加点击事件
        button.addTarget(self, action: #selector(composeButtonAction), for: .touchUpInside)
        //  设置不同状态的背景图片
        button.setBackgroundImage(UIImage(named: "tabbar_compose_button"), for: .normal)
        button.setBackgroundImage(UIImage(named: "tabbar_compose_button_highlighted"), for: .highlighted)
        //  设置不同状态的图片
        button.setImage(UIImage(named: "tabbar_compose_icon_add"), for: .normal)
        button.setImage(UIImage(named: "tabbar_compose_icon_add_highlighted"), for: .highlighted)
        
        //  根据内容设置大小
        button.sizeToFit()
        
        return button
    }()
    
    //  MARK: ---定义代理对象
    weak var hmDelegate: HMTabBarDelegate?
    //  MARK: ---定义闭包的属性
    var didSelectedComposeButtonClosure: (()->())?
    
    //  重写init(frame:xx),完成自定义按钮的添加
    //  如果重写init(frame:xx)表示首先代码方式去创建对象
    override init(frame: CGRect) {
        //  
        super.init(frame: frame)
        setupUI()
    }
    //  加载xib或者storyboard,会调用
    //  swift特有的, swift的魅力,更加友好的提示用的错误的原因
    required init?(coder aDecoder: NSCoder) {
        //  这句话的提示,表示不执行xib/storyboard
//        fatalError("init(coder:) has not been implemented")
        //  执行xib的写法
        super.init(coder: aDecoder)
        //
        setupUI()
    }
    
    //  添加子视图控件
    func setupUI() {
        //  设置背景图片,防止push出现黑影
        self.backgroundImage = UIImage(named: "tabbar_background")
        //  添加撰写按钮
        addSubview(composeButton)
    }
    //  MARK: --- 撰写按钮的点击事件
    //  private 修饰的方法是私有的,在swift的运行循环里面是找不到这个方法的,因为swift是编译型语言,在编译的时候就需要指定调用哪个方法,swift为了追求性能
    //  @objc: 表示oc机制,动态向对象派发消息使用setValue: forKey:
    //  事件函数如果加上private需要使用@objc使用oc的机制调用
    @objc private func composeButtonAction() {
        //  使用代理对象调用代理方法,完成回调
//        hmDelegate?.didSelectedComposeButtonOperation()
        //  执行闭包完成回调
        didSelectedComposeButtonClosure?()
    }
    
    //  调整子控件布局
    override func layoutSubviews() {
        //  一定加这句代码
        super.layoutSubviews()
        //  设置中心x
        composeButton.centerX = width * 0.5
        //  设置中心y
        composeButton.centerY = height * 0.5
        //  计算每一个按钮的宽度
        let itemWidth: CGFloat = width / 5
        //  系统私有的类,不能直接使用
//        UITabBarButton
        //  记录遍历按钮的索引
        var index = 0
        //  遍历tabbar的子按钮查找符合我们设置宽度的视图
        for subView in subviews {
            if subView.isKind(of: NSClassFromString("UITabBarButton")!) {
                //  找到系统的按钮,给其设置宽度,可以直接赋值
                subView.width = itemWidth
                //  设置UITabBarButton的x坐标
                subView.x = CGFloat(index) * itemWidth
                //  记录UITabBarButton的索引
                index += 1
                //  如果是第二个UITabBarButton需要加上一个宽度,放到加号按钮后面
                if index == 2 {
                    index += 1
                }
            }
        }
        
        
        
    }
    

}
